#ifndef AUDIO_RT_PROCESS_KF_H
#define AUDIO_RT_PROCESS_KF_H

#include <vector>
#include <cmath>


std::vector<__fp16> asymmetric_Analy_windows(int hop_length, int win_length, int zero_d);
std::vector<__fp16> asymmetric_Sys_windows(int hop_length, int win_length, int zero_d);
std::vector<std::vector<__fp16>> apply_window_multiply(
    const std::vector<std::vector<__fp16>>& Time_Cache_Matrix,
    const std::vector<__fp16>& Anly_Windows);
void multiply_last_n_rows_inplace(
    std::vector<std::vector<__fp16>>& matrix,
    const std::vector<__fp16>& window,
    size_t n_rows);
std::vector<__fp16> Generate_SysResult(
const std::vector<std::vector<__fp16>>& matrix,
const std::vector<__fp16>& window,
size_t n_rows);
void test_corruption();
float RT_Energe_Frame(std::vector<std::vector<__fp16>>& mag,
    size_t Frame);
void RT_WDRC(std::vector<std::vector<__fp16>>& mag,
        std::vector<std::vector<__fp16>>& WDRC_mag,
        std::vector<std::vector<__fp16>>& WDRC_Table);
void RT_FC(std::vector<std::vector<__fp16>>& mag,
        std::vector<std::vector<__fp16>>& FC_mag,
        std::vector<std::vector<__fp16>>& FC_Table);
void RT_FC_CSR(
    const std::vector<std::vector<__fp16>>& WDRC_mag,  // dense matrix 2 x FFT_BINS
    const std::vector<__fp16>& values,                 // FC_Table 非零元素
    const std::vector<int>& col_idx,                    // 对应列索引
    const std::vector<int>& row_ptr,                    // 每行起始位置
    std::vector<std::vector<__fp16>>& FC_mag);
void convertToCSR(std::vector<std::vector<__fp16>>& FC_Table,
                  std::vector<__fp16>& values,
                  std::vector<int>& col_idx,
                  std::vector<int>& row_ptr,
                  __fp16 threshold = 1e-5);
void Read_WDRC_Table(std::vector<std::vector<__fp16>>& WDRC_Table);
void Read_FC_Table(std::vector<std::vector<__fp16>>& FC_Table);
float calculateRMS(const std::vector<float>& audioData);
#endif